home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
comm1
/
intsdkss.lha
/
examples
/
udp
/
udp_server.c
< prev
Wrap
C/C++ Source or Header
|
1996-04-09
|
2KB
|
102 lines
/*
** UDP server example program.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <proto/socket.h>
#define DEFAULT_PORT 54321
#define TERMINATOR "quit\n"
main ( argc, argv )
int argc;
char *argv[];
{
int s, retcode, done;
long fromlen;
char buf[256];
struct sockaddr_in addr, from;
struct servent *sp;
/*
** Create a socket.
*/
s = socket ( AF_INET, SOCK_DGRAM,0 );
if ( s == -1 ) {
fprintf ( stderr, "Server can't create socket.\n");
exit(1);
}
/*
** Applications should get the service number from the services file.
** Try the services file first, and upon failure, use a default port
** number. This allows the example to run without modifying the
** system environment.
*/
memset(&addr, 0, sizeof(addr));
sp = getservbyname( "example", "udp" );
if( sp != NULL ) {
addr.sin_port = sp->s_port;
} else {
addr.sin_port = DEFAULT_PORT;
}
/*
** Binding assigns the local port number to the socket.
** Clients will send datagrams to this port.
** The address INADDR_ANY means the server is willing to accept
** datagrams arriving on any local interface.
*/
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
if ( bind ( s, (struct sockaddr *)&addr, sizeof (addr)) == -1 ) {
perror("bind");
exit (1);
}
fromlen = sizeof(from);
/*
** Server Main Loop - read datagram and echo back to client.
** If the datagram starts with the word "quit" terminate service.
** Unlike TCP sockets, UDP will transmit all or none of the
** requested data so there is no need to worry about partial
** writes. However, UDP is an unreliable protocol; datagrams
** may get lost, duplicated, or delivered in a out of order.
*/
done = 0;
while (!done) {
memset(&from, 0, sizeof(from));
retcode = recvfrom ( s, buf, sizeof(buf), 0,
(struct sockaddr *)&from, &fromlen );
if ( retcode < 0 ) {
perror("recvfrom");
exit (1);
}
buf[retcode] = 0;
fprintf(stdout, "Packet from %s, port %d, length %3d, data %s",
inet_ntoa(from.sin_addr),from.sin_port, retcode, buf);
if (!strncmp(buf, TERMINATOR, strlen(TERMINATOR))){
done = 1;
}
retcode = sendto ( s, buf, retcode, 0,
(struct sockaddr *)&from, fromlen );
if ( retcode < 0 ) {
perror("sendto");
exit (1);
}
}
exit(0);
}